﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;

namespace Projektarbete
{
    //Statisk klass för att spara/ladda filer eller annat som har med filhantering att göra (screenshots?)
    static class FileIO
    {
        /// <summary>
        /// Loads a map from a file
        /// </summary>
        /// <param name="path">path to the file including file extension</param>
        /// <returns></returns>
        public static Tile[][] LoadMapFromFile(string path)
        {
            //Temporärt array för att läsa in alla tiles
            Tile[][] Map;
            
            //Lista för att hålla alla rader i filen
            List<string> lines = new List<string>();

            try
            {
                //Skapa en Streamreader för att öppna och läsa "File.txt"
                using (StreamReader streamReader = new StreamReader(path))
                {
                    //Temporär variabel för att hålla raden då streamReader läser rad för rad
                    string line;

                    //Läs en rad i taget
                    while ((line = streamReader.ReadLine()) != null)
                    {
                        //Lägg till raden i listan
                        lines.Add(line);
                    }
                }
            }
            catch (Exception e)
            {
                //TODO: förbättra. Skicka ett meddelande även utan debug-mode
                throw new InvalidOperationException("Kan inte hitta/öppna File.txt. Fel: " + e.Message);
            }

            //Skapa ett jagged array där storleken av Y är antalet rader i filen (2 rader i filen = 2 rader in-game)
            Map = new Tile[lines.Count][];

            //Variabel för att räkna komman, behövs för att stödja tal > 9 (2 siffror)
            int commas = 0;

            for (int x = 0; x < lines.First().Length; x++)
            {
                if (lines.First()[x] == ',')
                {
                    commas++;
                }
            }

            for (int x = 0; x < lines.Count; x++)
            {
                //För varje Y i Map1, skapa en rad i X-led som är lika lång som det är siffror i filen (1,2,3,4 blir 4 i X-led)
                Map[x] = new Tile[commas];
            }

            //Vilken rad som blir läst från listan "lines"
            int rad = 0;

            foreach (string line in lines)
            {
                // Separatorn måste läggas i ett array av någon anledning, det fungerar inte annars
                char[] separator = { ',' };

                // Dela upp raden i alla värden (åtskilda av separatorn, dvs ett komma)
                string[] values = line.Split(separator, StringSplitOptions.RemoveEmptyEntries);

                // Läs in alla värden i Map-objektet på sin rätta plats
                for (int x = 0; x < values.Length; x++)
                    Map[rad][x] = new Tile(ushort.Parse(values[x]), true, 1);

                //Plussa i slutet av loopen för att gå till nästa rad i Map1.
                rad++;
            }

            return Map;
        }
         
        /// <summary>
        /// Returns a map from an image
        /// </summary>
        /// <param name="path">path to the file including extension</param>
        /// <param name="graphicsDevice">graphics device</param>
        /// <returns></returns>
        public static Tile[][] LoadMapFromImage(string path, GraphicsDevice graphicsDevice)
        {
            //Temporär variabel för att hålla bilden
            Texture2D file;
            Tile[][] map;

            Color[] fileToArray;
            Color[,] fileToArray2D;

            //Öppna bilden
            using (Stream stream = File.OpenRead(path))
            {
                //Läs in bilden i variabeln file
                file = Texture2D.FromStream(graphicsDevice, stream);
            }

            //Skapa ett array för att hålla alla färger från filen
            fileToArray = new Color[file.Width * file.Height];
            //Skapa ett 2d-array för att hålla alla fäger från filen
            fileToArray2D = new Color[file.Height, file.Width];
            //Fyll fileToArray med datan från filen
            file.GetData(fileToArray);
            
            map = new Tile[file.Height][];

            for (int y = 0; y < file.Height; y++)
            {
                for (int x = 0; x < file.Width; x++)
                {
                    fileToArray2D[y, x] = fileToArray[x + y * file.Width];
                }
            }

            for (int y = 0; y < file.Height; y++)
            {
                map[y] = new Tile[file.Width];
            }

            Random random = new Random();

            for (int y = 0; y < file.Height; y++)
            {
                for (int x = 0; x < file.Width; x++)
                {
                    //Kan ändras som man vill
                    if (fileToArray2D[y, x] == new Color(0, 0, 0)) //Nothing (black)
                    {
                        map[y][x] = new Tile(0, true);
                    }
                    else if (fileToArray2D[y, x] == new Color(155, 155, 155)) //Wall
                    {
                        map[y][x] = new Tile((ushort)random.Next(10, 20), true);
                    }
                    else if (fileToArray2D[y, x] == new Color(255, 255, 255)) //Floor
                    {
                        map[y][x] = new Tile((ushort)random.Next(1, 10), false);
                    }
                    else if (fileToArray2D[y, x] == new Color(255, 0, 0)) //Closed door
                    {
                        map[y][x] = new Door(20, 0);
                    }
                    else if (fileToArray2D[y, x] == new Color(155, 0, 0)) //Opened door
                    {
                        map[y][x] = new Door(21, 1);
                    }
                    else
                    {
                        map[y][x] = new Tile(0, false);
                    }
                }
            }
            return map;
        }
    }
}
